a48f9fd4652e0de8accb2b9b0e0da10d193553a0,src/web/org/codehaus/groovy/grails/web/metaclass/ControllerDynamicMethods.java,ControllerDynamicMethods,ControllerDynamicMethods,#GroovyObject#GrailsControllerHelper#HttpServletRequest#HttpServletResponse#,83

Before Change


            String[] scaffoldActions = this.scaffolder.getSupportedActionNames();
            for (int i = 0; i < scaffoldActions.length; i++) {
                try {
                    controller.getProperty(scaffoldActions[i]);
                }
                catch(MissingPropertyException mpe) {
                    addDynamicProperty(new GenericDynamicProperty(	scaffoldActions[i],

After Change





    public ControllerDynamicMethods( GroovyObject controller,GrailsControllerHelper helper,final HttpServletRequest request, HttpServletResponse response) throws IntrospectionException {
        super(controller);

        this.controllerClass = helper.getControllerClassByName(controller.getClass().getName());
        this.grailsAttributes = helper.getGrailsAttributes();

        // add dynamic properties
        addDynamicProperty(new GetParamsDynamicProperty(request,response));
        addDynamicProperty(new GetSessionDynamicProperty(request,response));
        addDynamicProperty(new GenericDynamicProperty(REQUEST_PROPERTY, HttpServletRequest.class,new GrailsHttpServletRequest( request,controller),true) );
        addDynamicProperty(new GenericDynamicProperty(RESPONSE_PROPERTY, HttpServletResponse.class,response,true) );
        addDynamicProperty(new GenericDynamicProperty(SERVLET_CONTEXT, ServletContext.class,helper.getServletContext(),true) );
        addDynamicProperty(new GenericDynamicProperty(FLASH_SCOPE_PROPERTY, FlashScope.class,grailsAttributes.getFlashScope(request),false) );
        addDynamicProperty(new GenericDynamicProperty(ERRORS_PROPERTY, Errors.class, null, false));
        addDynamicProperty(new GenericDynamicProperty(MODEL_AND_VIEW_PROPERTY, ModelAndView.class,null,false));
        addDynamicProperty(new GenericDynamicProperty(GRAILS_ATTRIBUTES, GrailsApplicationAttributes.class,grailsAttributes,true));
        addDynamicProperty(new GenericDynamicProperty(GRAILS_APPLICATION, GrailsApplication.class,grailsAttributes.getGrailsApplication(),true));
        addDynamicProperty(new GenericDynamicProperty(ACTION_URI_PROPERTY,String.class,null,false));
        addDynamicProperty(new GenericDynamicProperty(CONTROLLER_URI_PROPERTY,String.class,null,false));
        addDynamicProperty(new GenericDynamicProperty(ACTION_NAME_PROPERTY,String.class,null,false));
        addDynamicProperty(new GenericDynamicProperty(CONTROLLER_NAME_PROPERTY,String.class,null,false));
        addDynamicProperty(new GenericDynamicProperty(RENDER_VIEW_PROPERTY,Boolean.class, Boolean.TRUE,false));
        addDynamicProperty(new GenericDynamicProperty(LOG_PROPERTY, Log.class,
            LogFactory.getLog(controllerClass.getFullName()),true));

        // add dynamic methods
        addDynamicMethodInvocation( new RedirectDynamicMethod(helper,request,response) );
        addDynamicMethodInvocation( new ChainDynamicMethod(helper, request, response ) );
        addDynamicMethodInvocation( new RenderDynamicMethod(helper,request,response));
        addDynamicMethodInvocation( new BindDynamicMethod(request,response));

        // the getViewUri(name,request) method that retrieves the name of a view for current controller
        addDynamicMethodInvocation( new AbstractDynamicMethodInvocation(GET_VIEW_URI_PATTERN){

            public Object invoke(Object target, Object[] arguments) {
                if(arguments.length==0)
                    throw new MissingMethodException(GET_VIEW_URI,target.getClass(),arguments);
                if(arguments[0] == null)
                    throw new IllegalArgumentException("Argument [viewName] of method [" + GET_VIEW_URI + "] cannot be null");

                return grailsAttributes.getViewUri(arguments[0].toString(), request);
            }

        });

        // the getTemplateUri(name,request) method that retrieves the name of a template for current controller        
        addDynamicMethodInvocation( new AbstractDynamicMethodInvocation(GET_TEMPLATE_URI_PATTERN){

            public Object invoke(Object target, Object[] arguments) {
                if(arguments.length==0)
                    throw new MissingMethodException(GET_TEMPLATE_URI,target.getClass(),arguments);
                if(arguments[0] == null)
                    throw new IllegalArgumentException("Argument [templateName] of method [" + GET_TEMPLATE_URI + "] cannot be null");

                return grailsAttributes.getTemplateUri(arguments[0].toString(),request);
            }

        });

        // the hasErrors() dynamic method that checks of there are any errors in the controller
        addDynamicMethodInvocation( new AbstractDynamicMethodInvocation(HAS_ERRORS_METHOD_PATTERN) {
            public Object invoke(Object target, Object[] arguments) {
                GroovyObject controller = (GroovyObject)target;
                Errors errors = (Errors)controller.getProperty(ERRORS_PROPERTY);
                return Boolean.valueOf(errors.hasErrors());
            }
        });

        this.scaffolding = this.controllerClass.isScaffolding();

        // if the controller is scaffolding get the scaffolder, then loop through all the
        // support actions by the scaffolder and register dynamic properties for those that don't exist
        if(this.scaffolding) {
            this.scaffolder = helper.getScaffolderForController(controllerClass.getFullName());
            if(this.scaffolder == null) {
                throw new IllegalStateException("Scaffolder is null when controller scaffold property is set to 'true'");
            }
            String[] scaffoldActions = this.scaffolder.getSupportedActionNames();
            for (int i = 0; i < scaffoldActions.length; i++) {
            	Map properties = DefaultGroovyMethods.getProperties(controller);
            	if(!properties.containsKey(scaffoldActions[i])) {
                    addDynamicProperty(new GenericDynamicProperty(	scaffoldActions[i],
                                                                    Closure.class,
                                                                    scaffolder.getAction(controller,scaffoldActions[i]),